package one.stand.mapper;

import one.stand.entity.WxNoticeEntity;
import one.stand.entity.WxUserNoticeEntity;
import one.stand.model.BusinessCardModel;
import one.stand.model.CrmSeeRecordModel;
import one.stand.model.SeeRecordModel;
import one.stand.request.statistics.DealRateTopNResponse;
import one.stand.request.statistics.VisitMallStatisticsResponse;
import one.stand.response.CrmCustomerAnalysisRespnse;
import one.stand.response.CustomerAnalysisResponse;
import one.stand.response.SeeRecordHistoryResponse;
import one.stand.response.statistics.BusinessVisitStatistics;
import one.stand.response.statistics.TimeVisitStatisticsResponseCell;
import one.stand.response.statistics.VisitGoodsTopResponse;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * @author Administrator
 */
public interface SeeRecordMapper {
    int delSeeCard(SeeRecordModel record);

    int deleteByPrimaryKey(Integer recordId);

    WxUserNoticeEntity getSendTemplateInfo(Integer recordId);

    /**
     * crm名片查看记录
     *
     * @param userId       客户id
     * @param entranceType 入口类型
     * @param seeType      查看类型
     * @param myCardId     自己名片id
     * @return
     */
    List<CrmSeeRecordModel> getCrmSeeRecord(@Param("userId") Long userId, @Param("entranceType") Integer entranceType, @Param("seeType") Integer seeType,
                                            @Param("myCardId") Integer myCardId);

    /**
     * 客户个人分析
     *
     * @return
     */
    List<CrmCustomerAnalysisRespnse> countCustomerAnalysis(SeeRecordModel record);

    int insertSelective(SeeRecordModel record);

    int isTop(SeeRecordModel record);

    /**
     * 用户名片浏览记录
     */
    List<BusinessCardModel> seeDetail(BusinessCardModel record);

    int isHaveDefaultCard(BusinessCardModel record);

    /**
     * 查询默认名片
     *
     * @return 默认名片
     */
    List<BusinessCardModel> findDefaultBusinessCard(BusinessCardModel record);

    List<BusinessCardModel> selectDefaultCard(BusinessCardModel record);

    SeeRecordModel selectByPrimaryKey(Integer recordId);

    int selectMaxistop(Integer userId);

    int selectRanking(SeeRecordModel record);

    int updateByPrimaryKeySelective(SeeRecordModel record);

    /**
     * @param cardId 自己的名片id
     * @param userId 客户id
     * @return
     */
    CustomerAnalysisResponse getCustomerAnalysis(@Param("cardId") Integer cardId, @Param("userId") Integer userId, @Param("seeType") Integer seeType,
                                                 @Param("companyId") Integer companyId);

    Map<String, Object> getPcCount(SeeRecordModel model);

    String getPcPhotos(SeeRecordModel model);

    Map<String, Object> getChangeCount(SeeRecordModel model);

    Integer getChangeCountOne(SeeRecordModel model);

    List<Map<String, Object>> selectPcIndexCustomer(SeeRecordModel model);

    /**
     * 插入查看记录
     *
     * @param model 查看记录模型
     */
    void insertRecord(SeeRecordModel model);

    /**
     * 访问次数统计
     *
     * @param companyId 企业id
     * @param cardId    名片id
     * @param beginDate 开始时间
     * @param endDate   结束时间
     */
    BusinessVisitStatistics visitStatistics(@Param("companyId") Integer companyId, @Param("cardId") Integer cardId, @Param("beginDate") String beginDate,
                                            @Param("endDate") String endDate);

    /**
     * 访问统计
     *
     * @param companyId 企业id
     * @param cardId    名片id
     * @param beginDate 开始时间
     * @param endDate   结束时间
     */
    List<BusinessVisitStatistics> visitGroupStatistics(@Param("companyId") Integer companyId, @Param("cardId") Integer cardId,
                                                       @Param("beginDate") String beginDate, @Param("endDate") String endDate);

    /**
     * 时间统计 间隔2小时
     *
     * @param companyId 企业id
     * @param cardId    名片id
     * @param seeType   查看类型
     * @param beginDate 开始时间
     * @param endDate   结束时间
     */
    List<TimeVisitStatisticsResponseCell> timeStatisticsInterval2Hour(@Param("companyId") Integer companyId, @Param("cardId") Integer cardId,
                                                                      @Param("seeType") Integer seeType, @Param("beginDate") String beginDate,
                                                                      @Param("endDate") String endDate);

    /**
     * 时间统计 间隔1天
     *
     * @param companyId 企业id
     * @param seeType   查看类型
     * @param beginDate 开始时间
     * @param endDate   结束时间
     */
    List<TimeVisitStatisticsResponseCell> timeStatisticsIntervalDay(@Param("companyId") Integer companyId, @Param("cardId") Integer cardId,
                                                                    @Param("seeType") Integer seeType, @Param("beginDate") String beginDate,
                                                                    @Param("endDate") String endDate);

    /**
     * 访问排名
     *
     * @param cardId    名片id
     * @param seeType   查看类型 如果为空，则是所有
     * @param beginDate 开始时间
     * @param endDate   结束时间
     * @return 访问时间倒序排列
     */
    List<CrmSeeRecordModel> getVisitRanking(@Param("cardId") Integer cardId, @Param("seeType") Integer seeType, @Param("beginDate") String beginDate,
                                            @Param("endDate") String endDate);

    /**
     * 访问排名 的代替接口，只是查询记录列表
     *
     * @param cardId    名片id
     * @param seeType   查看类型 如果为空，则是所有
     * @param beginDate 开始时间
     * @param endDate   结束时间
     * @return 访问时间倒序排列
     */
    List<CrmSeeRecordModel> getSeeRecords(@Param("cardId") Integer cardId, @Param("seeType") Integer seeType, @Param("beginDate") String beginDate,
                                            @Param("endDate") String endDate);

    /**
     * 访问商品TOP3
     *
     * @param companyId   企业id
     * @param cardId      名片id
     * @param visitUserId 访客id 如果为空，则查询所有
     * @param topN        要访问的topN  如top3、top5等
     * @param beginDate   开始时间
     * @param endDate     结束时间
     * @return 商品topN
     */
    List<VisitGoodsTopResponse> getVisitGoodsTopN(@Param("companyId") Integer companyId, @Param("cardId") Integer cardId,
                                                  @Param("visitUserId") Integer visitUserId, @Param("topN") Integer topN, @Param("beginDate") String beginDate,
                                                  @Param("endDate") String endDate);

    /**
     * 通过访问类型统计数量
     *
     * @param companyId 企业id
     * @param seeType   访问类型
     * @param beginDate 开始时间
     * @param endDate   结束时间
     * @return 数量
     */
    Integer statisticsBySeeType(@Param("companyId") Integer companyId, @Param("seeType") Integer seeType, @Param("beginDate") String beginDate,
                                @Param("endDate") String endDate);

    /**
     * 统计交易成功的订单
     *
     * @param companyId 企业ID
     * @param beginDate 开始时间
     * @param endDate   结束
     * @return
     */
    VisitMallStatisticsResponse statisticsOrderWithDeal(@Param("companyId") Integer companyId, @Param("beginDate") String beginDate,
                                                        @Param("endDate") String endDate);

    /**
     * 成交率 topN
     * 成交率计算方法
     * 对访问类型进行分组进行统计，然后加权计算
     * 访问名片超过5次 算20分，否则算 (次数/5)*20
     * 访问预约超过5次 算20分，否则算 (次数/5)*20
     * 访问商城超过5次 算30分，否则算 (次数/5)*30
     * 访问动态超过5次 算15分，否则算 (次数/5)*15
     * 访问官网超过5次 算15分，否则算 (次数/5)*15
     */
    List<DealRateTopNResponse> dealRateTopN(Integer companyId, Integer cardId, Integer userId, Integer topN, String beginDate, String endDate);

    List<SeeRecordHistoryResponse> getSeeRecordHistory(Integer userId, Integer cardId);

    /**
     * 删掉游客登录后访问自己的数据
     *
     * @param touristsUserId 游客id
     * @param userId         登陆后用户的id
     */
    void deleteTouristsVisitSelfRecord(Integer touristsUserId, Integer userId);

    List<SeeRecordModel> selectByUserId(Integer userId);

    SeeRecordModel selectOneMaxRanking(Integer userId, Integer companyId, Integer seeType, Integer isList, Integer cardId, Integer itmeId, Integer seeUserId);

    void updateUserIdAndRanking(Integer recordId, Integer userId, Integer ranking);
}